#ifndef CONFIG_H
#define CONFIG_H
#include <iostream>
#include <string>
#include <map>
#include "lua_package.h"
using namespace std;

namespace ZY {




    class Config
    {
        public:
            Config( string file);
             ~Config();
            ///调用里的函数 参数1：函数名 参数2：参数列表 参数3：所掉函数的参数个数 参数4：返回值个数
             vector<string>& Call_config_func( const string func, string str[], int arg_num, int ret_num );
            ///获取一个table列表的数据
             vector<string>& Get_config_list( const string t_name );
             vector<string>& Get_config_list( const string t_name, const string index_str );

             float Get_config_float( const string t_name, const string index_str );
             float Get_config_float( const string t_name, const int order );

             int Get_config_int( const string t_name, const string index_str );
             int Get_config_int( const string t_name, const int order );

             string Get_config_string( const string t_name, const string index_str );
             string Get_config_string( const string t_name, const int order );
            ///设置lua的table
             void Set_config( const string t_name, const string index_str, string value );
             void Set_config( const string t_name, const string index_str, int value );
             void Set_config( const string t_name, const string index_str, float value );
             void Set_config( const string t_name, const int order, string value );
             void Set_config( const string t_name, const int order, int value );
             void Set_config( const string t_name, const int order, float value );
             void Set_config( const string t_name, string value );
             void Set_config( const string t_name, int value );
             void Set_config( const string t_name, float value );

             void Save_config( const string file_name, const string t_name );

             void Renew_config( const string file_name );
            // void close_config();

                 void Open_config( const string file_name );

                // void close_config();
                static Config & getInstance( string & filename );
                static Config & getInstance( char *cfilename );
                static void destroyInstance( const string & filename );
                static void destroyInstance( Config & conf );

                static Config & getInstance() { return getInstance(0);}
                static Config & getInstance( int id );
                static void destroyInstance( int id );

                const string & getFilename() {return m_filename;}
            protected:


            private:
                Config() : c_link(0) {  };

                string m_filename;

                Lua *c_link;
                static map< string , Config* > _configMap;
                static map< int , Config* > _configIntMap;
    };


    inline string C( const string & n )
    {
        return Config::getInstance().Get_config_string( "Config" , n );
    }

    inline string C( const char *n )
    {
        string str(n);
        return C(str);
    }

};
#endif // CONFIG_H
